/*
Array.from方法用于将两类对象转为真正的数组：
1.类似数组的对象（array-like object）
2.可遍历（iterable）的对象（包括 ES6 新增的数据结构 Set 和 Map）
*/

//下面是一个类似数组的对象， Array.from将它转为真正的数组。
let arrayLike = {
	'0': 'a',
	'1': 'b',
	'2': 'c',
	length: 3
};
// ES5的写法
var arr1 = [].slice.call(arrayLike); // ['a', 'b', 'c']
// ES6的写法
let arr2 = Array.from(arrayLike); // ['a', 'b', 'c']

// NodeList对象转数组
let ps = document.querySelectorAll('p');
Array.from(ps).filter(p => {
	return p.textContent.length > 100;
});

// arguments对象转数组
function foo() {
	var args = Array.from(arguments);
	// ...
}

// 字符串转数组  三种方法 => [...str]  str.split('')  Array.from(str)
Array.from('hello')


/*
Array.from还可以接受第二个参数，作用类似于数组的map方法，用来对每个元素进行处理，将处理后的值放入返回的数组。
*/

Array.from(arrayLike, x => x * x);
// 等同于
Array.from(arrayLike).map(x => x * x);
Array.from([1, 2, 3], (x) => x * x)
// [1, 4, 9]


//取出一组 DOM 节点的文本内容。
let spans = document.querySelectorAll('span.name');
// map()
let names1 = Array.prototype.map.call(spans, s => s.textContent);
// Array.from()
let names2 = Array.from(spans, s => s.textContent)


Array.from([1, , 2, , 3], (n) => n || 0) // [1, 0, 2, 0, 3]

function typesOf() {
	return Array.from(arguments, value => typeof value)
}
typesOf(null, [], NaN)// ['object', 'object', 'number']

